目录
- XML的作用
- XML书写语法规则
- Java解析XML
- XML语义约束
- XPath路径表达式
- B/S架构模式
- Servlet开发技巧
- Servlet执行原理
- Java Web核心特性
- Servlet核心对象
- JSP九大内置对象
- EL表达式
- JSTl常用标签
XML
XML(EXtensible Markup Language):可扩展标记语言,用来存储数据的标准语言
XML与HTML的比较:
- XML与HTML非常相似,都是编写标签
- XML没有预定义标签,HTML存在大量预定义标签
- XML重在保存与传输数据,HTML用于显示信息
XML的用途:
- Java程序的配置描述文件
- 用于保存程序产生的数据
- 网络间的数据传输
XML文档结构
- 第一行必须是XML声明
- 说明XML文档的基本信息,包括版本号与字符集,写在XML第一行
<?xml version="1.0" encoding="UTF-8"?> //encoding:编码
version 代表版本号1.0/1.1
encoding UTF-8设置字符集,用于支持中文
- 有且只有一个根节点
- XML标签的书写规则与HTML相同
XML标签书写规则
合法的标签名
- 标签名要有意义
- 建议使用英文,小写字母,单词之间使用“-”分割
- 建议多级标签之间不要存在重名的情况
适当的注释与缩进
合理使用属性
- 标签属性用于描述标签不可或缺的信息
- 对标签分组或者为标签设置Id时常用属性表示
特殊字符与CDATA标签
‘<’ 和 ‘>’ 特殊字符,会破坏文档结构
可以使用实体引用
实体引用 对应符号 说明 < < 小于 > > 大于 & & 和号 &apos ‘ 单引号 " “ 双引号 CDATA标签:指不应由XMl解析器进行解析的文本数据,原意输出
从“ < ! [CDATA[“开始,到”]] > ” 结束
有序的子元素
- 在XML多层嵌套的子元素中,标签前后顺序应保持一致
XML语义约束
- XML语义约束有两种定义方式:DTD与XML Schema
- DTD(Document Type Definition, 文档类型定义)是一种简单易用的语义约束方式
- DTD文件的扩展名为.dtd
- 利用DTD中的<!ELEMENT>标签,我们可以定义XML文档中允许出现的节点及数量,以hr.xml为例:
定义hr结点下只允许出现1个employee子节点
<!ELEMENT hr(employee)>
employee节点下必须包含以下四个结点,且按顺序出现
<!ELEMENT employee (name,age,salary,department)>
定义name标签体只能是文本,#PCDATA代表文本元素
<!ELEMENT name(#PCDATA)>
DTD定义节点数量
- 如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符
hr节点下最少出现1个employee子节点
<!ELEMENT hr(employee+)>
hr节点下可出现0..n个employee子节点
<!ELEMENT hr(employee*)>
hr节点下最多出现1个employee子节点
<!ELEMENT hr(employee?)>
XML引用DTD文件
- 在XML中使用<!DOCTYPE>标签来引用DTD文件
书写格式:
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
示例:
<!DOCTYPE hr SYSTEM "hr.dtd">
XML Schema(主流)
- XML Schema比DTD更为复杂,提供了更多功能
- XML Schema提供了数据类型、格式限定、数据范围等特性
- XML Schema是W3C标准 [万维网(World Wide Web)]
DOM文档对象模型
DOM(Document Object Model)定义了访问和操作XML文档的标准方法
Dom4j
Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点。
- Dom4j将XML视为Document对象
- XML标签被Dom4j定义为Element对象
对文件进行读取
对文件进行写入(Source-Format字段对齐)
XPath路径表达式
- XPath路径表达式是XML文档中查找数据的语言
- 掌握XPath可以极大的提高在提取数据时的开发效率
- 学习XPath本质就是掌握各种形式表达式的使用技巧
最常用的基本表达式
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
XPath基本表达式案例
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstore元素的所有子节点 |
/bookstore | 选取根元素bookstore,注释:假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径 |
bookstore/book | 选取属于bookstore的子元素的所有book元素 |
//book | 选取所有book子元素,而不管它们在文档中的位置 |
bookstore//book | 选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置 |
//@lang | 选取名为lang的所有属性 |
XPath谓语表达式
Jaxen介绍
Jaxen是一个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM,XOM,dom4j和JDOM
Don4j底层依赖Jaxen实现XPath查询
package com.imooc.m4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class XPathTestor {
public void xpath(String xpathExp){
String file = "E:/lianxi/xml/hr.xml";
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
List<Node> nodes = document.selectNodes(xpathExp);
for(Node node : nodes){
Element emp = (Element)node; //转换对象
System.out.println(emp.attributeValue("no"));
System.out.println(emp.elementText("name"));
System.out.println(emp.elementText("age"));
System.out.println(emp.elementText("salary"));
System.out.println("==============================");
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
XPathTestor testor = new XPathTestor();
// testor.xpath("/hr/employee");
// testor.xpath("//employee");
// testor.xpath("//employee[salary<4000]");
// testor.xpath("//employee[name='李铁柱']");
// testor.xpath("//employee[@no=3304]");
// testor.xpath("//employee[1]"); 编号最小的第一个
// testor.xpath("//employee[last()]"); 获取最后一个
//testor.xpath("//employee[position()<3]"); 当前位置小于3
testor.xpath("//employee[3] | //employee[8]"); //获取第3名和第八名员工
}
}